package edu.upc.clase.demo.dao.impl;

import edu.upc.clase.demo.dao.CanchaDao;
import edu.upc.clase.demo.entity.Cancha;
import java.util.Date;
import java.util.List;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * Six-Group-Upc
 */
@Repository
public class CanchaDaoImpl extends SimpleJdbcDaoSupport implements CanchaDao {

    private static Logger log = LoggerFactory.getLogger(CanchaDaoImpl.class);

    @Autowired
    public CanchaDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    }

    @Override
    public Integer insertar(Cancha cancha) {

        getJdbcTemplate().update(
                "insert into canchas (DescripcionCancha,CaracteristicasCancha,CodigoLocal,CodigoPromocion) values (?, ?, ?, ?)",
                cancha.getDescripcionCancha(), cancha.getCaracteristicasCancha(), cancha.getCodigoLocal(), cancha.getCodigoPromocion());
        return getSimpleJdbcTemplate().queryForInt("call identity()");
    }

    @Override
    public void actualizar(Cancha cancha) {
        getJdbcTemplate().update(
                "update canchas set DescripcionCancha = ?, CaracteristicasCancha = ?, CodigoLocal = ?, CodigoPromocion = ? where CodigoCancha = ?",
                cancha.getDescripcionCancha(), cancha.getCaracteristicasCancha(), cancha.getCodigoLocal(), cancha.getCodigoPromocion(), cancha.getCodigoCancha());
    }

    @Override
    public void reservar(Cancha cancha) {
        java.util.Date fecha = new Date();
        getJdbcTemplate().update(
                "insert into AlquilerCancha (CodigoAlquilerCancha,FechaAlquiler, FechaInicio ,	FechaFin ,  CodigoCanchaHorario ,CodigoCancha , CodigoUsuario , CodigoServicioAdicional) values (?, ?, ?, ?,?, ?, ?, ?)",
                cancha.getCodigoAlquilerCancha(),cancha.getFechaAlquiler() ,cancha.getFechaInicio(), cancha.getFechaFin(), cancha.getCodigoCanchaHorario(), cancha.getCodigoCancha(),cancha.getCodigoUsuario(),cancha.getCodigoServicioAdicional());
    }

    @Override
    public void eliminar(Cancha cancha) {
        getJdbcTemplate().update(
                "delete from canchas where CodigoCancha = ?", cancha.getCodigoCancha());
    }

    @Override
    public Cancha buscar(Integer id) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "select CodigoCancha,DescripcionCancha,CaracteristicasCancha,CodigoLocal,CodigoPromocion from canchas where CodigoCancha=?",
                    new BeanPropertyRowMapper<Cancha>(Cancha.class), id);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public List<Cancha> buscarTodos() {
        return getSimpleJdbcTemplate().query(
                //"select CodigoCancha,DescripcionCancha,CaracteristicasCancha,CodigoLocal,CodigoPromocion from canchas",
                "select CodigoCancha,DescripcionCancha,CaracteristicasCancha,c.CodigoLocal,c.CodigoPromocion,l.DescripcionLocal,p.DescripcionPromocion from canchas c inner join locales l on c.CodigoLocal=l.CodigoLocal inner join promociones p on c.CodigoPromocion=p.CodigoPromocion",
                new BeanPropertyRowMapper<Cancha>(Cancha.class));
    }

        @Override
    public List<Cancha> listarReservar() {
        return getSimpleJdbcTemplate().query(                
                "select CodigoAlquilerCancha,FechaAlquiler,FechaInicio,FechaFin,CodigoCanchaHorario,CodigoCancha,CodigoUsuario,CodigoServicioAdicional from AlquilerCancha",
                new BeanPropertyRowMapper<Cancha>(Cancha.class));
    }

    @Override
    public List<Cancha> buscarXLocal(Integer id) {
        return getSimpleJdbcTemplate().query(
                //"select CodigoCancha,DescripcionCancha,CaracteristicasCancha,CodigoLocal,CodigoPromocion from canchas",
                "select CodigoCancha,DescripcionCancha,CaracteristicasCancha,c.CodigoLocal,c.CodigoPromocion,l.DescripcionLocal,p.DescripcionPromocion from canchas c inner join locales l on c.CodigoLocal=l.CodigoLocal inner join promociones p on c.CodigoPromocion=p.CodigoPromocion  where c.CodigoLocal=?",
                new BeanPropertyRowMapper<Cancha>(Cancha.class), id);
    }

    @Override
    public Cancha buscar(String DescripcionCancha) {
        try {
            return getSimpleJdbcTemplate().queryForObject(
                    "select CodigoCancha,DescripcionCancha,CaracteristicasCancha,CodigoLocal,CodigoPromocion from canchas where DescripcionCancha=?",
                    new BeanPropertyRowMapper<Cancha>(Cancha.class), DescripcionCancha);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
}